package me.mingshan.leetcode;

/**
 * https://leetcode.cn/problems/reverse-vowels-of-a-string/description/
 *
 * 给你一个字符串 s ，仅反转字符串中的所有元音字母，并返回结果字符串。
 *
 * 元音字母包括 'a'、'e'、'i'、'o'、'u'，且可能以大小写两种形式出现不止一次。
 *
 *
 *
 * 示例 1：
 *
 * 输入：s = "IceCreAm"
 *
 * 输出："AceCreIm"
 *
 * 解释：
 *
 * s 中的元音是 ['I', 'e', 'e', 'A']。反转这些元音，s 变为 "AceCreIm".
 *
 * 示例 2：
 *
 * 输入：s = "leetcode"
 *
 * 输出："leotcede"
 *
 *
 * @author hanjuntao
 * @date 2025/7/15 0015
 */
public class L_345_reverse_vowels_of_a_string {

    public static void main(String[] args) {
        String s = "IceCreAm";
        //System.out.println(reverseVowels(s));

        //System.out.println(reverseVowels("leetcode"));

        //System.out.println(reverseVowels("a.b,."));

        System.out.println(reverseVowels("race a car"));
    }

    /**
     * 左右指针，分别指向元音字符，交换
     *
     * @param s
     * @return
     */
    public static String reverseVowels(String s) {
        char[] chars = s.toCharArray();

        int left = 0;
        int right = chars.length - 1;

        while (left < right) {
            // 找到右边的元音字母
            while (left < right && !isVowel(chars[right])) {
                right--;
            }

            while (left < right && !isVowel(chars[left])) {
                left++;
            }

            if (isVowel(chars[left]) && isVowel(chars[right])) {
                int temp = chars[left];
                chars[left] = chars[right];
                chars[right] = (char) temp;
            }

            left++;
            right--;
        }

        return new String(chars);
    }

    private static boolean isVowel(char aChar) {
        switch (aChar) {
            case 'a':
            case 'A':
            case 'e':
            case 'E':
            case 'i':
            case 'I':
            case 'o':
            case 'O':
            case 'u':
            case 'U':
                return true;
        }
        return false;
    }

}
